拖稿拖了這麼久,WMI 也描述了這麼多,到底要如何提供 WMI 給系統呢?
Microsoft Windows-driver-samples 提供了兩個範例 WMI
我們的目的是要 UEFI提供資訊給 APP,所以這部分以 WmiAcpi 為主,WmiAcpi 裡面包含了
檔案 | 說明 |
---|---|
device.asl | ASL 語言撰寫的 WMI Code,須包入 UEFI ACPI 提供 WMI 資訊 |
acpimof.mof | Managed 物件格式撰寫的檔案,讓 WMI Core 知道有哪些資訊,會編譯成 BMF 及 DLL,僅提供 resource。範例含9個 Class AcpiTest_QSPackage、AcpiTest_QSString、AcpiTest_QULong、AcpiTest_MPackage、AcpiTest_MString、AcpiTest_MULong、AcpiTest_EventPackage、AcpiTest_EventString、AcpiTest_EventULong |
acpimof.def | 建立 Acpimof.dll 所需要的的檔案 |
acpimof.rc | 建立 Acpimof.dll 所需要的檔案 |
wmi-acpi.htm | WMI and ACPI 白皮書,對 WmiAcpi 有很詳細的說明 |
acpimov.vcxproj | Visual Studio project 檔案 |
acpimof.sln | Visual Studio solution 檔案 |
最直接的方式就是用 Microsoft Visual Studio 來直接 build,因為這部分包含了 Driver 相關,建議照 Microsoft安裝整套 Visual Studio、SDK、WDK,通常安裝後的檔案會在 C:\Program Files (x86)\Windows Kits。
Build 產生的資料夾中重要的檔案有
檔案 | 說明 |
---|---|
acpimof.bmf | 二進制的 MOF 檔案,由 mofcomp.exe 轉換 |
acpimof.dll | AcpiMof動態連結檔,僅包含 AcpiMof 的 Resource 資訊 |
acpimof.x | 包含二進位 MOF 資料的文字標記法的文字檔,由wmimofck.exe 轉換 |
mofcomp.exe 在系統C:\Windows\System32\wbem\ 可找到,用指令mofcomp -B:acpimof.bmf acpimof.mof 轉換出二進制的 acpimof.bmf。
wmimofck.exe 是 WDK 套件裡的程式,可在C:\Program Files (x86)\Windows Kits\10\bin\ 裡找到,
用指令 wmimofck -xacpimof.x acpimof.bmf 轉換出 包含二進位 MOF 資料的文字標記法的文字檔 acpimof.x。
acpimof.dll 由 acpimof.mof、acpimof.def、acpimof.rc 等相關檔案 Link 而來,詳細指令可查詢 build 出來的產物 link.command.1.tlog
^C:\VSPROJECT\DRIVER\WMIACPI\X64\DEBUG\ACPIMOF.RES
/OUT:"X64\DEBUG\ACPIMOF.DLL" /INCREMENTAL:NO /NOLOGO /WX KERNEL32.LIB USER32.LIB GDI32.LIB WINSPOOL.LIB COMDLG32.LIB ADVAPI32.LIB SHELL32.LIB OLE32.LIB OLEAUT32.LIB UUID.LIB ODBC32.LIB ODBCCP32.LIB /DEF:"ACPIMOF.DEF" /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"X64\DEBUG\ACPIMOF.PDB" /TLBID:1 /NOENTRY /DYNAMICBASE /NXCOMPAT /IMPLIB:"X64\DEBUG\ACPIMOF.LIB" /MACHINE:X64 /IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221,4108,4088,4218,4218,4235 /DLL X64\DEBUG\ACPIMOF.RES
有了這些檔案後我們就可以參考Microsoft wmi-acpi-sample 提到的方法,完成 WmiAcpi 的系統設置,接著就可以在 WMI 的 Name Space WMI 看到結果,
device.asl 宣告了一個 Device AMW0,Device 名稱是可以替換的,Device HID 固定為 PNP0C14, WDG 裡描述了 WMI 的資料、事件、及方法。
開機時系統 PnP 認到ACPI DSDT 有 PNP0C14 的裝置,就會安裝C:\Windows\System32\drivers\wmiacpi.sys 並透過它將指定的 Acpimof.dll (MOF resource) 紀錄在 WMI 資料庫裡。
正規的方法是直接將 device.asl 包進 UEFI DSDT table,不同 UEFI Vendor包入的方法會有差異,可查詢有 PNP0C14 HID 的 ASL 檔案,確認包入 ACPI DSDT 的方式,或是直接複製 Device(AMW0) 到查詢有 PNP0C14 的 Device 旁。
我用的是 AMI BIOS,device.asl 在編譯時遇到一些問題需要修正,
Name(_HID, "*pnp0c14") 需修改為 Name(_HID, "PNP0C14")
Method(WQAA, 1) 裡 Store(Debug, Foo1) 需修改為 Store(Foo1, Debug)
用含device.asl 的 BIOS 開機,用 RW ACPI 可看到 DSDT 裡有AMW0 Device。但這時還未安裝 MOF 資訊,所以用 WMI Explorer 看 WMI 資料庫 root\WMI是沒有東西的。
這裡有兩種做法,結果相同,可自行依需求選擇。
我們先前已經 build 好acpimof.dll
我們先前已經 build 好 acpimof.x,只要以特定的 GUID 將 MOF 資訊 (acpimof.x) 包入 UEFI ACPI Device PNP0C14 _WDG,OS 開機時會 query WMI 關於 MOF GUID的資訊,WMI存在這組 GUID 的話就會回傳 MOF Table 給 OS,OS 解析後再將 MOF資訊紀錄在 WMI 資料庫,成功後 WMI 資料庫可看到相關資訊。
Name(_WDG, Buffer() {
...
// Query MOF, This GUID for returning the MOF data
0x21, 0x12, 0x90, 0x05, 0x66, 0xd5, 0xd1, 0x11, 0xb2, 0xf0, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, //
67, 65, // Object ID (CA) mapping to WQCA.
1, // Instance Count
0x00, // Flags
...
})
Name(WQCA, Buffer() { // WQXX mapping to Object ID
// Table in Wmiacpi.x, or just include Wmiacpi.x
0x46, 0x4f, 0x4d, 0x42, ...
})
可在 WMI 資料庫看到 MOF 描述的 Class,
用先前介紹的 WMI Explorer 2.0.0.2 (Administrator) 可直接進行測試
執行測試
儲存 Test Script 後進行測試
目前了解了 WMI 的相關知識與運作原理,WMI BIOS 部分也知道如何架構,系統方面的安裝與測試也略懂,但實際上要從無到有將相關檔案寫出來或是修改,還是需要對 Sample文件的相關語言,有較深入且詳細的了解,這部分就要繼續 K SPEC。